Introduction

This analysis demonstrates overlapping community detection with the “linkcomm” (link communities) package. We include analyses that help us understand the link communities algorithm and analyses that help us see how the results inform us about an application domain.

The software package is documented by Kalinka, A. T. (2014). The generation, visualization, and analysis of link communities in arbitrary networks with the R package linkcomm (CRAN project vignette). The underlying algorithm and link similarity metrics are described by. Ahn, Y.-Y., Bagrow, J. P., & Lehmann, S. (2010). Link communities reveal multiscale complexity in networks. Nature, 466, 761-765.

We analyze the Network Science co-authorship network constructed by Mark Newman, who used weights to model strength of collaboration based on number of co-authors on a paper and number of papers authored together. The questions we ask are only concerned with dichotomous presence or absence of co-authorship, so we compute link communities on an unweighted network to better match our questions and to simplify interpretation of results. We also compute Louvain and InfoMap community partitions for comparison.


4. Interpreting Induced Overlapping Node Communities

Having explained how link communities are computed, in this section we demonstrate the utility of overlapping community detection with examples.

(a) Barabasi and Albert

First we show how membership in link communities maps to the ground-truth of paper publications by finding the paper for a link community. “BARABASI, A” and “ALBERT, R” are both in link community COMM_226, along with co-authors JEONG H, OLTVAI Z, TOMBOR B, BIANCONI G, as shown below:

Although this link community is based on multiple publications, one well known paper that includes most of the link community members is:

Jeong H, Tombor B, Albert R, Oltvai ZN, Barabási AL. The large-scale organization of metabolic networks. Nature. 2000 Oct 5;407(6804):651-4. doi: 10.1038/35036627. PMID: 11034217.

(b) Pastor-Satorras

An advantage of link communities over partitioning methods is that a node may belong to more than one community. As shown below, “PASTORSATORRAS, R” (Pastor-Satorras), is involved in several link communities. We identify three of them below, corresponding to major applications of network science in which Pastor-Satorras has published.

Epidemic Spreading in Networks: Pastor-Satorras is in link community: COMM_279, COMM_263, along with co-authors Vespignani A, Moreno Y, and Barthelemy M. (There are more but for the sake of simplicity I chose these 3 communities and 3 authors.) as shown below:

Papers in this link community include work on epidemic spreading in networks, as evidenced by this publication involving most or all of these authors:

Pastor-Satorras R, Vespignani A. Epidemic spreading in scale-free networks. Phys Rev Lett. 2001 Apr 2;86(14):3200-3. doi: 10.1103/PhysRevLett.86.3200. PMID: 11290142.

Moreno, Y., Pastor-Satorras, R. & Vespignani, A. Epidemic outbreaks in complex heterogeneous networks. Eur. Phys. J. B 26, 521–529 (2002). https://doi.org/10.1140/epjb/e20020122

Barthélemy M, Barrat A, Pastor-Satorras R, Vespignani A. Dynamical patterns of epidemic outbreaks in complex heterogeneous networks. J Theor Biol. 2005 Jul 21;235(2):275-88. doi: 10.1016/j.jtbi.2005.01.011. PMID: 15862595.

Protein Interaction Networks: Pastor-Satorras is in link community COMM_286, along with co-authors Smith E and Sole R as shown below:

Papers in this link community include work on protein interaction networks, as evidenced by this publication involving most or all of these authors:

Pastor-Satorras R, Smith E, Solé RV. Evolving protein interaction networks through gene duplication. J Theor Biol. 2003 May 21;222(2):199-210. doi: 10.1016/s0022-5193(03)00028-6. PMID: 12727455.

Social Distance Attachment:

Pastor-Satorras is in link community COMM_203, along with co-authors BOGUNA M, DIAZGUILERA A, ARENAS A as shown below:

Papers in this link community include work on social distance attachment, as evidenced by this publication involving most or all of these authors:

Boguñá, Marián, Romualdo Pastor-Satorras, Albert Díaz-Guilera and Alex Arenas. “Models of social networks based on social distance attachment.” Physical review. E, Statistical, nonlinear, and soft matter physics 70 5 Pt 2 (2004): 056122 .


5. Comparing to Partition Methods

In a previous analysis we compared Louvain and InfoMap to each other. Below we compare Lovain and InfoMap partitions to link communities, to see their similarities and differences. To facilitate the comparison, we have selected a portion of the full visualization and colored nodes by both Louvain and InfoMap partitioning, shown below:

Louvain and Link Communities

InfoMap and Link Communities

We notice the following similarities and differences between link communities and the other two:

For similarities: The visual impact shows that louvain and infomap understood the general idea of the amount of communities there are. The main difference is the amount of people that are included in the community. If you take a look at the color chart associated with infomap or louvain respectively, you can see louvain is typically overestimating the amount of nodes that belong in a community whereas infomap provides finer granularity partitions. Louvain seems to consider that more nodes belong to particular communities because of the granularity of overlapping node communities. When several nodes overlap, louvain’s weight threshold is probably determining that they belong in the community. This means our scenario previously of an author publishing with another author but they don’t share a community would not appear from Louvain as it would assume they are in the same community.

Because of this, louvain and infomap do not agree on the true sizes of the communities. The colors are associated in order. Louvain says: Barabasi (orange) is the 4th largest community whilst Infomap says: Barabasi (blue) is the 2nd largest community.

Considering question 3, I would suggest that Link Communities also finds these specific behaviors. For example, in question 3, we concluded that, “The first pair are not in Newman’s link community because once Newman connects to either Sole or Stauffer, every node associated with them never leaves their community.” This would be difficult to find for Louvain as Louvain would overfit the amount of nodes that belong in a community and this behavior of a node never leaving it’s community would disappear.

In addition, considering question 3 again, Link Communities would also help find nodes that act as bridges more accurately. If a node is overfit into a community it doesn’t belong in, then you can’t consider them as bridge nodes and their purpose will disappear.


Pau

LS0tDQp0aXRsZTogIlBhcmsgQW5hbHlzaXMgOCBPdmVybGFwcGluZyBDb21tdW5pdGllcyINCmF1dGhvcjogIkluIFdvbyBQYXJrIg0KZGF0ZTogIjQvMjUvMjAyMiINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBkZl9wcmludDogcGFnZWQNCiAgaHRtbF9ub3RlYm9vazogDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0UsIGVjaG89RkFMU0V9DQpyZXF1aXJlKCJrbml0ciIpDQpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmxpYnJhcnkoaWdyYXBoKQ0KbGlicmFyeSh0aWJibGUpDQpsaWJyYXJ5KGxpbmtjb21tKQ0KIyBGb3IgaW5jbHVkaW5nIGltYWdlcyBvZiB0aGVzZSB0eXBlcw0KbGlicmFyeShqcGVnKSANCmxpYnJhcnkocG5nKQ0KIyBVdGlsaXRpZXMgbWF5IGJlIGFkZGVkIGhlcmUuDQpzb3VyY2UoIlV0aWxpdHkvcmVpZnlfbGlua19jb21tdW5pdGllcy5SIikNCmBgYA0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCiMjIyMgSW50cm9kdWN0aW9uIA0KDQpUaGlzIGFuYWx5c2lzIGRlbW9uc3RyYXRlcyBvdmVybGFwcGluZyBjb21tdW5pdHkgZGV0ZWN0aW9uIHdpdGggdGhlICJsaW5rY29tbSIgKGxpbmsgY29tbXVuaXRpZXMpIHBhY2thZ2UuIFdlIGluY2x1ZGUgYW5hbHlzZXMgdGhhdCBoZWxwIHVzIHVuZGVyc3RhbmQgdGhlIGxpbmsgY29tbXVuaXRpZXMgYWxnb3JpdGhtIGFuZCBhbmFseXNlcyB0aGF0IGhlbHAgdXMgc2VlIGhvdyB0aGUgcmVzdWx0cyBpbmZvcm0gdXMgYWJvdXQgYW4gYXBwbGljYXRpb24gZG9tYWluLiANCg0KVGhlIHNvZnR3YXJlIHBhY2thZ2UgaXMgZG9jdW1lbnRlZCBieSBLYWxpbmthLCBBLiBULiAoMjAxNCkuIFRoZSBnZW5lcmF0aW9uLCB2aXN1YWxpemF0aW9uLCBhbmQgYW5hbHlzaXMgb2YgbGluayBjb21tdW5pdGllcyBpbiBhcmJpdHJhcnkgbmV0d29ya3Mgd2l0aCB0aGUgUiBwYWNrYWdlIGxpbmtjb21tIChDUkFOIHByb2plY3QgdmlnbmV0dGUpLiBUaGUgdW5kZXJseWluZyBhbGdvcml0aG0gYW5kIGxpbmsgc2ltaWxhcml0eSBtZXRyaWNzIGFyZSBkZXNjcmliZWQgYnkuICBBaG4sIFkuLVkuLCBCYWdyb3csIEouIFAuLCAmIExlaG1hbm4sIFMuICgyMDEwKS4gTGluayBjb21tdW5pdGllcyByZXZlYWwgbXVsdGlzY2FsZSBjb21wbGV4aXR5IGluIG5ldHdvcmtzLiBOYXR1cmUsIDQ2NiwgNzYxLTc2NS4NCg0KV2UgYW5hbHl6ZSB0aGUgTmV0d29yayBTY2llbmNlIGNvLWF1dGhvcnNoaXAgbmV0d29yayBjb25zdHJ1Y3RlZCBieSBNYXJrIE5ld21hbiwgd2hvIHVzZWQgd2VpZ2h0cyB0byBtb2RlbCBzdHJlbmd0aCBvZiBjb2xsYWJvcmF0aW9uIGJhc2VkIG9uIG51bWJlciBvZiBjby1hdXRob3JzIG9uIGEgcGFwZXIgYW5kIG51bWJlciBvZiBwYXBlcnMgYXV0aG9yZWQgdG9nZXRoZXIuIFRoZSBxdWVzdGlvbnMgd2UgYXNrIGFyZSBvbmx5IGNvbmNlcm5lZCB3aXRoIGRpY2hvdG9tb3VzIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgY28tYXV0aG9yc2hpcCwgc28gd2UgY29tcHV0ZSBsaW5rIGNvbW11bml0aWVzIG9uIGFuIHVud2VpZ2h0ZWQgbmV0d29yayB0byBiZXR0ZXIgbWF0Y2ggb3VyIHF1ZXN0aW9ucyBhbmQgdG8gc2ltcGxpZnkgaW50ZXJwcmV0YXRpb24gb2YgcmVzdWx0cy4gV2UgYWxzbyBjb21wdXRlIExvdXZhaW4gYW5kIEluZm9NYXAgY29tbXVuaXR5IHBhcnRpdGlvbnMgZm9yIGNvbXBhcmlzb24uIA0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCiMjIyMgMS4gQ29tcHV0aW5nIGFuZCBWaXN1YWxpemluZyBMaW5rIENvbW11bml0aWVzIA0KDQojIyMjIyAoYSkgUHJlcGFyYXRpb24gb2YgdGhlIE5ldHdvcmsNCg0KVGhlIG5ldHdvcmsgd2UgYW5hbHl6ZSBpcyByZWFkIGluIGFuZCBzdW1tYXJpemVkIGJlbG93LiANCg0KYGBge3J9DQpOUyA8LSByZWFkX2dyYXBoKCJOZXR3b3Jrcy9uZXRzY2llbmNlLmdyYXBobWwiLCANCiAgICAgICAgICAgICAgICAgZm9ybWF0PSJncmFwaG1sIikNCnN1bW1hcnkoTlMpDQpgYGANCg0KV2UgY29tcHV0ZSBub2RlIGNlbnRyYWxpdGllcyB0aGF0IG1heSBoZWxwIHVzIGxhdGVyIGluIG91ciBpbnRlcnByZXRhdGlvbnMsIGFuZCBzYXZlIHRoZSBjZW50cmFsaXRpZXMgYXMgdmVydGV4IGF0dHJpYnV0ZXMuIA0KDQpgYGB7cn0NCiMgQ29tcHV0ZSB1bndlaWdodGVkIGRlZ3JlZSwgd2VpZ2h0ZWQgZGVncmVlLCB1bndlaWdodGVkIHBhZ2UgcmFuaywNCiMgYW5kIHVud2VpZ2h0ZWQgYmV0d2Vlbm5lc3MgY2VudHJhbGl0eSBmb3IgdGhlIHZlcnRpY2VzIGluIHRoaXMNCiMgZ3JhcGgsIGFuZCBhc3NpZ24gdGhlbSB0byB2ZXJ0aWNlcyBhcyBhdHRyaWJ1dGVzDQoNClYoTlMpJGRlZ3JlZSA8LSBkZWdyZWUoTlMpDQpWKE5TKSR3ZGVncmVlIDwtIHN0cmVuZ3RoKE5TLCBtb2RlPSJhbGwiKQ0KVihOUykkcGFnZXJhbmsgPC0gcGFnZV9yYW5rKE5TKSR2ZWN0b3IgDQpWKE5TKSRiZXR3ZWVubmVzcyA8LSBiZXR3ZWVubmVzcyhOUywgbm9ybWFsaXplZD1UUlVFLCB3ZWlnaHRzPTEvRShOUykkd2VpZ2h0KQ0Kc3VtbWFyeShOUykNCmBgYA0KDQpXZSBhbHNvIGNvbXB1dGUgdW53ZWlnaHRlZCBMb3V2YWluIGFuZCBJbmZvTWFwIHBhcnRpdGlvbnMgZm9yIGxhdGVyIHVzZSBpbiBjb21wYXJpc29uIHRvIG92ZXJsYXBwaW5nIGxpbmsgY29tbXVuaXRpZXMuIA0KDQpgYGB7cn0NCiMgQ29tcHV0ZSB1bndlaWdodGVkIGNsdXN0ZXJfbG91dmFpbiBhbmQgdW53ZWlnaHRlZCBjbHVzdGVyX2luZm9tYXANCiMgY29tbXVuaXR5IG1lbWJlcnNoaXAsIGFuZCBhc3NpZ24gdGhlc2UgYXMgYXR0cmlidXRlcyB0byB0aGUNCiMgdmVydGljZXMuDQpWKE5TKSRsb3V2YWluICA8LSBtZW1iZXJzaGlwKGNsdXN0ZXJfbG91dmFpbihOUykpDQpWKE5TKSRpbmZvbWFwICA8LSBtZW1iZXJzaGlwKGNsdXN0ZXJfaW5mb21hcChOUykpDQpzdW1tYXJ5KE5TKQ0KYGBgDQoNCiMjIyMjIChiKSBDb21wdXRpbmcgTGluayBDb21tdW5pdGllcyANCg0KVW53ZWlnaHRlZCBsaW5rIGNvbW11bml0aWVzIGFyZSBjb21wdXRlZCBiZWxvdywgdXNpbmcgdGhlICJhdmVyYWdlIiBoaWVyYXJjaGljYWwgY2x1c3RlcmluZyBtZXRob2QuIA0KDQpgYGB7cn0NCiMgQ29uc3RydWN0IGFuIHVud2VpZ2h0ZWQgZWRnZSBsaXN0Lg0KIyBDb21wdXRlIGxpbmsgY29tbXVuaXRpZXMgd2l0aCBoY21ldGhvZCAiYXZlcmFnZSIsIGFuZCB2ZXJib3NlPUZBTFNFDQojICAgYW5kIHBsb3Q9RkFMU0UuIERPIE5PVCBVU0Uge3IgZWNobz1GQUxTRX06IGl0IGhpZGVzIHRoZSBjb2RlIA0KIyBQcmludCB0aGUgbGluayBjb21tdW5pdHkgb2JqZWN0DQoNCk5TX2VkZ2VzIDwtIGFzX2VkZ2VsaXN0KE5TKQ0KaGVhZChOU19lZGdlcykNCg0KTlNfbGMgPC0gZ2V0TGlua0NvbW11bml0aWVzKE5TX2VkZ2VzLCBoY21ldGhvZD0iYXZlcmFnZSIsIHZlcmJvc2U9RkFMU0UsIHBsb3Q9RkFMU0UpDQpwcmludChOU19sYykNCmBgYA0KDQpXZSAicmVpZnkiIGxpbmsgY29tbXVuaXRpZXMsIHVzaW5nIGEgdXRpbGl0eSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBuZXcgbm9kZSBmb3IgZWFjaCBsaW5rIGNvbW11bml0eSB3aXRoIHByb3BlcnR5ICJjb21tX3AiIFRSVUUsIGFuZCBpbnN0YWxsaW5nIGRpcmVjdGVkIGVkZ2VzIGZyb20gZWFjaCBub2RlIHJlcHJlc2VudGluZyBhdXRob3JzIHRvIHRoZSBub2RlcyByZXByZXNlbnRpbmcgbGluayBjb21tdW5pdGllcyBpbiB3aGljaCB0aGUgYXV0aG9ycyBwYXJ0aWNpcGF0ZS4gKFRoaXMgbW9kaWZpZXMgdGhlIG5ldHdvcmssIHdoaWNoIGlzIHdoeSB3ZSBwcmUtY29tcHV0ZWQgc3RydWN0dXJhbGx5IHNlbnNpdGl2ZSBtZXRyaWNzIGFuZCBwYXJ0aXRpb25zIG9mIGludGVyZXN0IGFib3ZlLikgDQoNCmBgYHtyfQ0KIyBVc2UgcmVpZnlfbGlua19jb21tdW5pdGllcyB0byBjcmVhdGUgYSBjb3B5IG9mIHRoZSBncmFwaCB3aXRoIGxpbmsNCiMgY29tbXVuaXRpZXMgcmVpZmllZCBhcyBub2Rlcy4gU3VtbWFyaXplIHRoZSBuZXcgZ3JhcGguDQojIHN1bW1hcnkoLi4uKQ0KDQpOU19jb21tIDwtIHJlaWZ5X2xpbmtfY29tbXVuaXRpZXMoTlMsIE5TX2xjKQ0KYGBgDQoNClRoZSByZXN1bHQgaXMgd3JpdHRlbiBvdXQgYXMgZ3JhcGhtbCB0byByZWFkIGludG8gR2VwaGkuIA0KDQpgYGB7cn0NCiMgd3JpdGVfZ3JhcGgsIGdpdmluZyBpdCBhIGRpZmZlcmVudCBuYW1lIHRvIGluZGljYXRlIGl0IGhhcyBsaW5rDQojIGNvbW11bml0aWVzLiBJbmNsdWRlIHRoaXMgaW4geW91ciBIVyBzdWJtaXNzaW9uLiANCg0Kd3JpdGVfZ3JhcGgoTlNfY29tbSwgIk5ldHdvcmtzL05TLVJlaWZpZWQtQ29tbXVuaXRpZXMuZ3JhcGhtbCIsIGZvcm1hdD0iZ3JhcGhtbCIpDQpgYGANCg0KDQojIyMjIyAoYykgVmlzdWFsaXppbmcgTGluayBDb21tdW5pdGllcyANCg0KVGhlIGxpbmsgY29tbXVuaXRpZXMgd2VyZSB2aXN1YWxpemVkIGluIEdlcGhpIGFzIGZvbGxvd3M6IA0KDQpOb2RlU2l6ZTogRGVncmVlIHcvIE1pbiA9IDEwLCBNYXggPSAxMDAsIA0KTm9kZUNvbG9yOiBjb21tX3Agdy8gUGluayBmb3IgRmFsc2UsIEdyZWVuIGZvciBUcnVlLiANCkdyYXBoTGF5b3V0OiBPcGVuT3JkIC0+IEZvcmNlQXRsYXMgMiB3LyBTY2FsaW5nID0gMC41LCBHcmF2aXR5ID0gMi41LCBMaW5Mb2cgbW9kZSBhbmQgUHJldmVudCBPdmVybGFwIGFjdGl2YXRlZC4gDQpFeHBhbnNpb24gdXNlZCB0d2ljZS4NCkxhYmVscyBhY3RpdmF0ZWQgYW5kIHNpemVkIGJ5IHByb3BvcnRpb24uIA0KDQpGdWxsIHJlc29sdXRpb24gUERGIGlzIGF2YWlsYWJsZSBpbiBmaWxlIHExX2MucGRmLiBBIGxvdyByZXNvbHV0aW9uIHZlcnNpb24gaXNzaG93biBiZWxvdy4gDQoNCmBgYHtyICBlY2hvPUZBTFNFLCBmaWcuYWxpZ249ImNlbnRlciIsIGZpZy5jYXAgPSAiUHJldmlldyBvZiBMaW5rIENvbW11bml0eSBWaXN1YWxpemF0aW9uIn0NCiBpbmNsdWRlX2dyYXBoaWNzKCJJbWFnZXMvcTFfYy5wbmciKQ0KYGBgDQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KIyMjIyAyLiBCYXNpY3Mgb2YgdGhlIExpbmsgQ29tbXVuaXRpZXMgQWxnb3JpdGhtIA0KDQpJbiB0aGlzIHNlY3Rpb24gd2UgZXhwbGFpbiB0aGUgYmFzaWNzIG9mIGhvdyBsaW5rIGNvbW11bml0aWVzIGFyZSBjb21wdXRlZCwgYmVnaW5uaW5nIHdpdGggZXhwbGFuYXRpb25zIG9mIHRoZSBhYnNlbmNlIG9mIGxpbmsgY29tbXVuaXRpZXMgYW5kIHRoZW4gb2YgaG93IGxpbmsgc2ltaWxhcml0eSBpcyB1c2VkIHRvIGNvbnN0cnVjdCBsaW5rIGNvbW11bml0aWVzLiANCg0KIyMjIyMgKGEpIElzb2xhdGUgTm9kZXMgDQoNClRoZXJlIGFyZSBtYW55IGlzb2xhdGUgbm9kZXMgaW4gdGhlIG5ldHdvcmssIHN1Y2ggYXMgIkZSRUVNQU4sIEwiLiBUaGVzZSBhcmUgbm90IGNsYXNzaWZpZWQgaW50byBub2RlIGNvbW11bml0aWVzIGJlY2F1c2UgdGhlc2Ugbm9kZXMgZXhoaWJpdCAwIHZhbHVlcyBmb3IgZGVncmVlLCB3ZWlnaHRlZCBkZWdyZWUsIGFuZCBiZXR3ZWVubmVzcy4gRXNzZW50aWFsbHksIHRoZXkgYXJlIG5vdCBjb25uZWN0ZWQgYXQgYWxsIHRvIHRoZSByZWlmaWVkIGNvbW11bml0eSBncmFwaC4gIA0KDQojIyMjIyAoYikgSXNvbGF0ZWQgRHlhZHMgYW5kIDItcGF0aHMgDQoNClRoZXJlIGFyZSBhbHNvIG1hbnkgaXNvbGF0ZWQgZHlhZHMgKGUuZy4sICJNQSwgSCIgYW5kICJaRU5HLCBBIikgYW5kIDItcGF0aHMgKGUuZy4sICJDU0VURSwgTSIsICJET1lMRSwgSiIsIGFuZCAiQ0FSTFNPTiwgSiIpLiBUaGVzZSBhcmUgKm5vdCogY2xhc3NpZmllZCBpbnRvIG5vZGUgY29tbXVuaXRpZXMsIGV2ZW4gdGhvdWdoIHRoZXkgaGF2ZSBsaW5rcyBiZXR3ZWVuIHRoZW0uIEluIHRoZSBkb2N1bWVudGF0aW9uIGl0IHNheXMsICJBZnRlciBhc3NpZ25pbmcgcGFpcndpc2Ugc2ltaWxhcml0aWVzIHRvIGFsbCBvZiB0aGUgbGlua3MgaW4gdGhlIG5ldHdvcmssIHRoZSBsaW5rcyBhcmUgaGllcmFyY2hpY2FsbHkgY2x1c3RlcmVkIHVzaW5nIHNpbmdsZS1saW5rYWdlIGNsdXN0ZXJpbmcsIGFuZCB0aGUgcmVzdWx0aW5nIGRlbmRyb2dyYW0gaXMgY3V0IGF0IGEgcG9pbnQgdGhhdCBtYXhpbWlzZXMgdGhlIGRlbnNpdHkgb2YgbGlua3Mgd2l0aGluIHRoZSBjbHVzdGVycyBub3JtYWxpc2luZyBhZ2FpbnN0IHRoZSBtYXhpbXVtIGFuZCBtaW5pbXVtIG51bWJlcnMgb2YgbGlua3MgcG9zc2libGUgaW4gZWFjaCBjbHVzdGVyLCBrbm93biBhcyB0aGUgcGFydGl0aW9uIGRlbnNpdHkiLiBTbyBvbiB0b3Agb2YgdGhpcywgd2Ugc2hvdWxkIGFzc3VtZSB0aGF0IHRoZSBmdW5jdGlvbiBnZXRfTGlua0NvbW11bml0aWVzIGFwcGxpZXMgYSB0aHJlc2hvbGQgZm9yIHRoZSBhbW91bnQgb2YgbGlua3MgYSBub2RlIGhhcyB0byBiZSBjb25zaWRlcmVkIGEgY29tbXVuaXR5LiBKdXN0IGJ5IG9ic2VydmluZyB0aGUgZ3JhcGgsIEkgd2lsbCBtYWtlIHRoZSBhc3N1bXB0aW9uIHRoYXQgYSBjb21tdW5pdHkgaXMgcHJlc2VudCB3aGVuIHRoZXJlIGFyZSBhdCBsZWFzdCAzIG5vZGVzIGNvbm5lY3RlZCB0byBlYWNoIG90aGVyLiBUaGUgZmlndXJlIHByb3ZpZGVkIGJlbG93IHNob3dzIG15IGFzc3VtcHRpb24uIA0KYGBge3J9DQppbmNsdWRlX2dyYXBoaWNzKCJJbWFnZXMvcTJfYi5wbmciKQ0KYGBgDQoNCkhvd2V2ZXIsIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSAzIG5vZGVzIGFyZSBjb25uZWN0ZWQgYnV0IGFyZSBub3QgY29tbXVuaXRpZXMuIFRoaXMgY2FuIGJlIGluIGluc3RhbmNlIHdoZXJlIHRoZSByZWxhdGlvbnNoaXAgaXMgcHVyZWx5IGxpbmVhci90cmFuc2l0aXZlLiANCkEgLT4gQiAtPiBDIGFuZCBub3QgbGlrZTogQUI8LT5BQzwtPkJDLiBPciwgOSBwb3NzaWJpbGl0aWVzIG9mIGxpbmthZ2UgYmV0d2VlbiBhbGwgbWVtYmVycy4gWW91IGNhbiBzaG93IHRoaXMgd2l0aCBhIG1hdHJpeCBidXQgc2ltcGx5LCB0aGUgZnVuY3Rpb24gaXRzZWxmIGhhcyBhIHRocmVzaG9sZCB0aGUgbm9kZXMgbmVlZCB0byBzdXJwYXNzLiBJbiBhZGRpdGlvbiwgeW91IGNhbiBhbHNvIGFzc3VtZSB0aGF0IGR5YWRzIGluIGdlbmVyYWwgYXJlbid0IHJlYWxseSBncm91cHMgYmVjYXVzZSBkeWFkcyBhcmUgbW9yZSBlcGhlbWVyYWwgdGhhbiBncm91cHMgYW5kIG9yIHRoZXkgYXJlIHNpbXBsZXIgaW4gdGhhdCBzb21lIHBoZW5vbWVuYSBjYW5ub3Qgb2NjdXIgaW4gZHlhZHMuIA0KDQojIyMjIyAoYykgTGluayBTaW1pbGFyaXR5IENvbXB1dGF0aW9ucyBhbmQgVXNlIA0KDQpCZWxvdyBpcyBhIHNjcmVlbiBjYXB0dXJlIG9mIHRoZSBjbHVzdGVyIGFzc29jaWF0ZWQgd2l0aCBhdXRob3IgIkdFSVNFTCwgVCIsIHdoaWNoIHdlIHdpbGwgdXNlIGFzIGFuIGV4YW1wbGUsIGluIGZvdXIgcGFydHMuDQoNCmBgYHtyICBlY2hvPUZBTFNFLCBmaWcuYWxpZ249ImNlbnRlciIsIGZpZy5jYXAgPSAiR2Vpc2VsJ3MgTGluayBDb21tdW5pdGllcyJ9DQppbmNsdWRlX2dyYXBoaWNzKCJJbWFnZXMvcTJfYy5wbmciKQ0KYGBgDQoNCioqTGluayBDb21tdW5pdGllczoqKiBUaGUgbGluayBjb21tdW5pdGllcyBpbiB0aGlzIGNsdXN0ZXIgYXJlOiANCg0KKiBDT01NXzEyMDogRG9kZWwsIEhlcnJtYW4sIEdlaXNlbA0KKiBDT01NXzEyMTogQnJvY2ttYW5uLCBIdWZuYWdlbCwgR2Vpc2VsDQoqIENPTU1fMTIzOiBXb2xmLCBUaW1tZSwgR2Vpc2VsDQoNCg0KDQoqKlNpbWlsYXJpdHkgTWV0cmljIENvbXB1dGF0aW9uczoqKiBBc3N1bWluZyBhbiB1bndlaWdodGVkIGdyYXBoLCB3ZSBjb21wdXRlIGxpbmsgc2ltaWxhcml0aWVzIGZvciB0aGlzIGNsdXN0ZXIgYXJlIGFzIGZvbGxvd3MgOiANCg0KV2UgaGF2ZSB0byBmaW5kIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIG5laWdoYm9yIG5vZGVzIG9mIGkgaW5jbHVkaW5nIGl0c2VsZiBvdmVyIHRoZSB1bmlvbiBvZiBuZWlnaGJvciBub2RlcyB0byBmaW5kIHRoZSByZWxhdGl2ZSBudW1iZXIgb2YgY29tbW9uIG5laWdoYm9ycyBub2RlIGkgYW5kIGogaGF2ZS4gV2l0aCBHZWlzZWwsIFQgYXMgYSBrZXlzdG9uZSwgd2UgY29uc2lkZXIgdGhlIG90aGVyIG5vZGVzIGFzIHRoZSBuZWlnaGJvciBub2Rlcy4gV2UgZG8gbm90IGNvdW50IHRoZSBjb21tdW5pdHkgbm9kZSBjb2xvciBjb2RlZCBpbiBncmVlbi4gDQoNClNpbWlsYXJpdHkgZm9yIHBhaXJzIG9mIGVkZ2VzIHRoYXQgYXJlIHdpdGhpbiB0aGUgc2FtZSBsaW5rIGNvbW11bml0eSBhbmQgc2hhcmUgR2Vpc2VsIChlLmcuLCB7R2Vpc2VsLCBUaW1tZX0sIHtHZWlzZWwsIFdvbGZ9KTogQmV0d2VlbiB0aGUgcGFpcnMgR2Vpc2VsL1RpbW1lIChUaW1tZSA9IGkpIGFuZCBHZWlzZWwvV29sZiAoV29sZiA9IGopLCB0aGUgbnVtZXJhdG9yIGlzIDIgYmVjYXVzZSBvZiBHZWlzZWwgYmVpbmcgYSBrZXlzdG9uZSBhbmQgVGltbWUvV29sZiBzaGFyZSBHZWlzZWwgZHVyaW5nIHRoZSBuZWlnaGJvciBpbnRlcnNlY3Rpb24uIFRoZSBkZW5vbWluYXRvciBpcyA2IGJlY2F1c2UgdGhlIHVuaW9uIGlzIDYgd2hlbiB3ZSBjb3VudCBub2RlcyBpIGFuZCBqJ3MgbmVpZ2hib3Igbm9kZXMgaW5jbHVkaW5nIHRoZW1zZWx2ZXMuIFRoZXJlZm9yZSB0aGUgc2ltaWxhcml0eSBtZXRyaWMgaXMgMi82IHx8IDEvMy4NCg0KU2ltaWxhcml0eSBmb3IgcGFpcnMgb2YgZWRnZXMgdGhhdCBhcmUgd2l0aGluIHRoZSBzYW1lIGxpbmsgY29tbXVuaXR5IGJ1dCBkbyBub3Qgc2hhcmUgR2Vpc2VsIChlLmcuLCB7VGltbWUsIFdvbGZ9LCB7VGltbWUsIEdlaXNlbH0pOiBCZXR3ZWVuIHRoZSBwYWlycyBUaW1tZS9Xb2xmIGFuZCBUaW1tZS9HZWlzZWwsIHRoZSBzaW1pbGFyaXR5IG1ldHJpYyBpcyBhbHNvIDEvMyBhcyB3ZSBjYW4gdXNlIHRoZSByZWFzb25pbmcgYWJvdmUgYnV0IHN3aXRjaCB0aGUga2V5c3RvbmUgdG8gVGltbWUsIGFuZCBjb25zaWRlciBub2RlIGkgYXMgV29sZiwgYW5kIEdlaXNlbCBhcyBqLiANCg0KU2ltaWxhcml0eSBmb3IgcGFpcnMgb2YgZWRnZXMgdGhhdCBhcmUgaW4gZGlmZmVyZW50IGxpbmsgY29tbXVuaXRpZXMgYnV0IHNoYXJlIEdlaXNlbCAoZS5nLiwge1RpbW1lLCBHZWlzZWx9LCB7SGVycm1hbm4sIEdlaXNlbH0pOiBCZXR3ZWVuIHRoZSBwYWlycyBUaW1tZS9HZWlzZWwgYW5kIEhlcnJtYW4vR2Vpc2VsLCBJIGRvbid0IGJlbGlldmUgdGhleSBzaGFyZSBhIGNvbW1vbiBuZWlnaGJvciBvdGhlciB0aGFuIEdlaXNlbCBhcyB0aGVyZSBpcyBubyBsaW5rIGJldHdlZW4gVGltbWUgYW5kIEhlcm1hbm4gYXMgdGhleSBiZWxvbmcgaW4gZGlmZmVyZW50IGNvbW11bml0aWVzLiBUaGlzIHdvdWxkIG1lYW4gdGhlIG51bWVyYXRvciBpcyAxIGFzIHdlIGNvdW50IEdlaXNlbCBpdHNlbGYgYW5kIG5vZGVzIGkgYW5kIGogaW4gdW5pb24gcmV0dXJucyA2LiBUaGUgbWV0cmljIGlzIDEvNi4gDQoNCioqQ29uc3RydWN0aW5nIExpbmsgQ29tbXVuaXRpZXM6KiogVGhlIGFsZ29yaXRobWljIHN0ZXBzIGJ5IHdoaWNoIHRoZXNlIHNpbWlsYXJpdHkgdmFsdWVzIGFyZSB1c2VkIHRvIHByb2R1Y2UgdGhlIGFib3ZlIGxpbmsgY29tbXVuaXRpZXMgYXJlIGFzIGZvbGxvd3MuIF9fX19fX19fX19fX18gKkRvIE5vdCByZXBlYXQgdGhlIGFib3ZlIGNvbXB1dGF0aW9uLiBEbyBub3QganVzdCBnaXZlIGEgZ2VuZXJpYyBleHBsYW5hdGlvbi4gRGVzY3JpYmUgd2hhdCB0aGUgbGlua2NvbW1tIGFsZ29yaXRobSBkb2VzIHdpdGggdGhlIGFib3ZlIGxpbmtzIGJhc2VkIG9uIHRoZWlyIHNpbWlsYXJpdHkgbnVtYmVycy4gV2hhdCBoYXBwZW5zIGZpcnN0PyBldGMuIFJlbW92ZSB0aGlzIG5vdGUuKg0KDQpUbyBwcm9kdWNlIHRoZSBhYm92ZSBsaW5rIGNvbW11bml0aWVzIHdlIGZpcnN0IHVzZWQgdGhlIEphY2NhcmQgY29lZmZpY2llbnQgd2hpY2ggaXMgdGhlIGVxdWF0aW9uIHVzZWQgdG8gY29tcHV0ZSBsaW5rIHNpbWlsYXJpdGllcy4gQWZ0ZXIgYXNzaWduaW5nIHBhaXJ3aXNlIHNpbWlsYXJpdGllcyB0byBhbGwgb2YgdGhlIGxpbmtzIGluIHRoZSBuZXR3b3JrIHtHZWlzZWwsIFtpbnNlcnQgdW5pcXVlIDEvNiBub2RlXX0sIHRoZSBnZXRMaW5rQ29tbXVuaXRpZXMoKSBhbGdvcml0aG0gaGllcmFyY2hpY2FsbHkgY2x1c3RlcnMgdGhlIHBhaXJ3aXNlIHNpbWlsYXJpdGllcyB1c2luZyBzaW5nbGUgbGlua2FnZSBjbHVzdGVyaW5nIChvdXIgZXhhbXBsZXMgYWJvdmUgd2VyZSAxLzMsIDEvMywgMS82LCBldGMpLiBUaGUgcmVzdWx0IGlzIGEgZGVuZHJvZ3JhbSB0aGF0IGlzIGN1dCBhdCBhIHBvaW50IHRoYXQgbWF4aW1pemVzIHRoZSBkZW5zaXR5IG9mIGxpbmtzIHdpdGhpbiB0aGUgY2x1c3RlcnMuIFRoaXMgZGVuc2l0eSBmdW5jdGlvbiBub3JtYWxpemVzIGFnYWluc3QgdGhlIG1heGltdW0gYW5kIG1pbmltdW0gbnVtYmVycyBvZiBsaW5rcyBwb3NzaWJsZSBpbiBlYWNoIGNsdXN0ZXIgKDEvMyB3b3VsZCBiZSB0aGUgcG9pbnQgdGhhdCBtYXhpbWl6ZXMgdGhlIGRlbnNpdHkgb2YgbGlua3Mgd2l0aGluIHRoZSBjbHVzdGVycyBJIGFzc3VtZSkuIEJlY2F1c2UgdGhlIG5vZGVzIGZvbGxvdyB0aGlzIDEvMyBwcm9wZXJ0eSB3aXRoIHNvbWUgbGlua3MgYmV0dGVyIHRoYW4gb3RoZXJzLCB0aGUgcmVzdWx0IGlzIGEgbmljZSwgZXF1YWxseSBzcGFjZWQgc3ViIGNsdXN0ZXIgd2l0aCAzIGNvbW11bml0aWVzIHRoYXQgYWxsIHNoYXJlIEdlaXNlbCBhcyB0aGVpciBrZXlzdG9uZS4gIA0KDQoqKkluZHVjZWQgTm9kZSBDb21tdW5pdGllczoqKiBOb2RlcyBhcmUgYXNzaWduZWQgdG8gb3ZlcmxhcHBpbmcgY29tbXVuaXR5IGFzIGZvbGxvd3M6IA0KDQoqIENPTU1fMTIwDQoqIENPTU1fMTIxDQoqIENPTU1fMTIzDQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KIyMjIyAzLiBMaW5rIENvbW11bml0aWVzIHZlcnN1cyBFZ28gTmV0d29ya3MNCg0KSW4gb3JkZXIgdG8gZnVydGhlciB1bmRlcnN0YW5kIGxpbmsgY29tbXVuaXRpZXMsIHdlIGNvbnNpZGVyIHR3byBjYXNlcyB0aGF0IG1pZ2h0IGJlIGNvbnNpZGVyZWQgYW5vbWFsb3VzIGlmIHdlIGRpZCBub3QgaGF2ZSB0aGlzIHVuZGVyc3RhbmRpbmc6IG5vZGVzIHRoYXQgYXJlIGluIHRoZSBzYW1lIGluZHVjZWQgY29tbXVuaXR5IGJ1dCBoYXZlIG5vIGxpbmsgYmV0d2VlbiB0aGVtLCBhbmQgbm9kZXMgdGhhdCBhcmUgbm90IGluIHRoZSBzYW1lIGNvbW11bml0eSBidXQgZG8gaGF2ZSBsaW5rcyBiZXR3ZWVuIHRoZW0uIFRoYXQgaXMsIHdlIGV4YW1pbmUgaG93IGxpbmsgY29tbXVuaXRpZXMgZGVwYXJ0IGZyb20gZWdvIG5ldHdvcmtzLiANCg0KIyMjIyMgKGEpIFVubGlua2VkIE5vZGVzIGluIHRoZSBTYW1lIEluZHVjZWQgQ29tbXVuaXR5IA0KDQpBcyBzaG93biBiZWxvdywgIldBVFRTLCBEIiBpcyBpbiB0aGUgc2FtZSBpbmR1Y2VkIG5vZGUgY29tbXVuaXR5IGFzICJIT1BDUk9GVCwgSiIgYW5kICJLTEVJTkJFUkcsIEoiLCBidXQgdGhlcmUgaXMgbm8gZGlyZWN0IGxpbmsgYmV0d2VlbiB0aGVtLCBpbmRpY2F0aW5nIHRoYXQgV2F0dHMgZGlkIG5vdCBwdWJsaXNoIHdpdGggZWl0aGVyIG9mIHRoZW0gKGFzIG9mIHRoaXMgZGF0YSBjYXB0dXJlKS4gDQoNCmBgYHtyICBlY2hvPUZBTFNFLCBmaWcuYWxpZ249ImNlbnRlciIsIGZpZy5jYXAgPSAiV2F0dHMsIEhvcGNyb2Z0IGFuZCBLbGVpbmJlcmcifQ0KIGluY2x1ZGVfZ3JhcGhpY3MoIkltYWdlcy9xM19hLnBuZyIpICNkZXB0aCAxDQppbmNsdWRlX2dyYXBoaWNzKCJJbWFnZXMvcTNfYTIucG5nIikgI2RlcHRoIDINCmBgYA0KDQpUaGUgcmVhc29uIHRoZXkgY2xhc3NpZmllZCBpbiB0aGUgc2FtZSBsaW5rIGNvbW11bml0eSBpbiBzcGl0ZSBvZiBub3QgaGF2aW5nIGRpcmVjdCBsaW5rcyBpcyBiZWNhdXNlIHRoZXkgYXJlIGNvbm5lY3RlZCB0aHJvdWdoIGEgM3JkIHBhcnR5IG5vZGUgYWN0aW5nIGFzIGEgYnJpZGdlLiBGb3IgV0FUVFMsIEQsIHRoZSBub2RlIGhhcyB0d28gbGlua3MgaXQgY2FuIHVzZSB0byBjb25uZWN0IHdpdGggSE9QQ1JPRlQgb3IgS0xFSU5CRVJHLCBuYW1lbHkgU1RST0dBVFogYW5kIE5FV01BTi4gVGhpcyBtZWFucyB0aGF0IGFsdGhvdWdoIFdBVFRTIGRvZXNuJ3QgaGF2ZSBhIGRpcmVjdCBsaW5rIHRvIEhPUENST0ZUIG9yIEtMRUlOQkVSRywgU1RST0dBVFogYW5kIE5FV01BTiBhcmUgYm90aCBjb25uZWN0ZWQgdG8gdGhlbSB3aGljaCBzYXRpc2ZpZXMgb3VyIHByZXZpb3VzIHRocmVzaG9sZCBhc3N1bXB0aW9uIG9mIGhhdmluZyBhdCBsZWFzdCAzIG5vZGVzIGNvbm5lY3RlZCB3aGVyZSB0aGUgcmVsYXRpb25zaGlwIGlzIG5vdCAidHJhbnNpdml0aXZlL2xpbmVhciIgKGkuZS4sIEEtPkItPkMpIGJ1dCB0aGUgY29ubmVjdGlvbnMgYXJlIHJlY2lwcm9jYXRlZCAoQUI8LT5BQzwtPkJDKS4gVGhlIGhpbnQgSSBmb3VuZCBmb3IgdGhpcyBxdWVzdGlvbiB3YXMgZmlsdGVyaW5nIGJ5IFdBVFRTLEQgZm9yIE5vZGUgSUQgYW5kIHNldHRpbmcgdGhlIGRlcHRoIHRvIDIuIFRoaXMgaXMgYWxzbyB3aHkgV0FUVFMsIEQsIGlzIG5vdyBhcGFydCBvZiBtYW55IG1vcmUgY29tbXVuaXRpZXMgYXMgeW91IHNsb3dseSBpbmNyZWFzZSB0aGUgZGVwdGguIEFzIGxvbmcgYXMgdGhlIGNvbm5lY3Rpb25zIHNhdGlzZnkgdGhlIHRocmVzaG9sZCwgKFdBVFRTIDwtPiBbTkVXTUFOIDwtPiBTVFJPR0FUWl0pLCBhbnkgbm9kZSB0aGF0IHNhdGlzZmllcyB0aGUgdGhyZXNob2xkIGFzIHdlbGwgKFtLTEVJTkJFUkcgfHwgSE9QQ1JPRlRdIDwtPiBbTkVXTUFOIDwtPiBTVFJPR0FUWl0pIHdpbGwgYmUgcGFydCBvZiB0aGUgc2FtZSBjb21tdW5pdHkgKHdpdGggdGhlIGRpZmZlcmVuY2Ugb2YgZGVlcGVyIGRlcHRoKS4gVGhpcyBsaW5rYWdlIGlzIGVub3VnaCB0byBjb21iaW5lIHRoZW0gaW4gb25lIGxpbmsgY29tbXVuaXR5LiANCg0KIyMjIyMgKGIpIExpbmtlZCBOb2RlcyBOb3QgaW4gYSBTaGFyZWQgSW5kdWNlZCBDb21tdW5pdHkgDQoNCiJORVdNQU4sIE0iIHB1Ymxpc2hlcyB3aXRoIChoYXMgbGlua3MgdG8pIGZvdXIgYXV0aG9ycyB3aG8gYXJlICpub3QqIGluIGhpcyBsaW5rIChpbmR1Y2VkIG5vZGUpIGNvbW11bml0eSwgYnV0IGFyZSBpbiBvdGhlciBsaW5rIGNvbW11bml0aWVzLiBUaGUgc3RydWN0dXJhbCBzaXR1YXRpb24gaXMgaWxsdXN0cmF0ZWQgYmVsb3csIGZvbGxvd2VkIGJ5IGV4cGxhbmF0aW9ucyBhbmQgZGlzY3Vzc2lvbiBvZiBzaWduaWZpY2FuY2UuIA0KDQpgYGB7ciAgZWNobz1GQUxTRSwgZmlnLmFsaWduPSJjZW50ZXIiLCBmaWcuY2FwID0gIk5ld21hbidzIENvLUF1dGhvcnMifQ0KIyBJbmNsdWRlIGZpbHRlcmVkIHN1YmdyYXBoIHNob3dpbmcgTmV3bWFuLCBoaXMgbGluayBjb21tdW5pdHksIGFuZCB0aGUgDQojIG5vZGVzIGluIHF1ZXN0aW9uIHRoYXQgYXJlIG5vdCBpbiBoaXMgbGluayBjb21tdW5pdHkuIEVhc3kgd2F5OiANCiMgTmV3bWFuJ3MgZWdvIG5ldHdvcmsgb2Ygb3JkZXIgMi4gDQojaW5jbHVkZV9ncmFwaGljcygiSW1hZ2VzL3EzX2IucG5nIikNCmluY2x1ZGVfZ3JhcGhpY3MoIkltYWdlcy9xM19iMi5wbmciKSAjd2hvJ3MgY29ubmVjdGVkIHRvIG5ld21hbj8NCmluY2x1ZGVfZ3JhcGhpY3MoIkltYWdlcy9xM19iMy5wbmciKSAjd2hvJ3MgaW4gdGhlIGNvbW11bml0eV8zMDU/DQoNCiMgQ09NTUVOVDogWW91IGFyZSBhbGxvd2VkIHRvIGNoYW5nZSAgdGhlIHN0cnVjdHVyZSBvZiB0aGUgcGFyYWdyYXBocw0KIyBiZWxvdyBpZiB5b3UgZmluZCBhbm90aGVyIHdheSB0byBvcmdhbml6ZSB0aGUgZGlzY3Vzc2lvbiB0byBiZSBtb3JlDQojIG5hdHVyYWwuDQpgYGANCg0KVGhlIGF1dGhvcnMgaW4gcXVlc3Rpb24gYXJlOiBbSG9sbWUsIFBdLCBbU3RhdWZmZXIsIERdLCBbU29sZSwgUl0sIFtTbmVwcGVuLCBLXS4gVGhlc2UgYXV0aG9ycyBhcmUgaW4gdHdvIGRpZmZlcmVudCBzdHJ1Y3R1cmFsIHNpdHVhdGlvbnMgcmVsYXRpdmUgdG8gTmV3bWFuIGFuZCBlYWNoIG90aGVyOiBbSG9sbWUsIFAgJiBTbmVwcGVuLCBLXSwgYW5kIFtTb2xlLCBSICYgU3RhdWZmZXIsIERdLiANCg0KVGhlIGZpcnN0IHBhaXIgYXJlIG5vdCBpbiBOZXdtYW4ncyBsaW5rIGNvbW11bml0eSBiZWNhdXNlIG9uY2UgTmV3bWFuIGNvbm5lY3RzIHRvIGVpdGhlciBTb2xlIG9yIFN0YXVmZmVyLCBldmVyeSBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGVtIG5ldmVyIGxlYXZlcyB0aGVpciBjb21tdW5pdHkuIFRoZSBub2RlcyBhcmUgc3RyaWN0bHkgY29ubmVjdGVkIHRvIG90aGVyIG5vZGVzIGluIHRoZSBjb21tdW5pdHkgb25seS4gVGhlcmVmb3JlIHdlIGRvbid0IHNlZSBhIGNvbW11bml0eSByZWxhdGlvbnNoaXAgYmV0d2VlbiBOZXdtYW4gPC0+IFNvbGUgPC0+IE90aGVyIC0+IE5vdGhpbmcuDQoNCmBgYHtyfQ0KaW5jbHVkZV9ncmFwaGljcygiSW1hZ2VzL3EzX2I0LnBuZyIpICN3aG8ncyBjb25uZWN0ZWQgdG8gU3RhdWZmZXI/DQppbmNsdWRlX2dyYXBoaWNzKCJJbWFnZXMvcTNfYjUucG5nIikgI3dobydzIGNvbm5lY3RlZCB0byBTb2xlPw0KYGBgDQoNClRoZSBzZWNvbmQgcGFpciBhcmUgbm90IGluIE5ld21hbidzIGxpbmsgY29tbXVuaXR5IGJlY2F1c2UgaXQgc2VlbXMgdGhhdCB0aGV5IGFyZSBzaW1wbHkgdG9vIGZhciBhd2F5LiBIb2xtZSBhbmQgU25lcHBlbiBtYXkgaGF2ZSBkaXJlY3QgbGlua3MgdG8gTmV3bWFuLCBidXQgYSBuZWlnaGJvciBsaW5rIHRha2VzIGEgZGVwdGggb2YgMiB0byByZWFjaCBuZXdtYW4uIEZvciBpbnN0YW5jZTogTmV3bWFuIDwtPiBIb2xtZSAtPiBUcnVzaW5hIC0+IFNuZXBwZW4gLT4gTmV3bWFuIG9yIE5ld21hbiA8LT4gSG9sbWUgLT4gTGVpY2h0IDwtPiBOZXdtYW4uIFRoZSBmaXJzdCBleGFtcGxlIHNob3dzIHRoYXQgdGhlIHJlcXVpcmluZyB0d28gbGluayBqdW1wcyBpcyBzaW1wbHkgdG9vIGZhciBmb3IgaXQgdG8gYmUgY29uc2lkZXJlZCBhIGNvbW11bml0eSBidXQgdGhlIHNlY29uZCBleGFtcGxlIG9ubHkgcmVxdWlyZXMgMSBob3AsIHNvIHdoYXQncyB1cCB3aXRoIHRoYXQ/IFBlcmhhcHMgaGF2aW5nIG9ubHkgMSBpbnN0YW5jZSB3aGVyZSBIb2xtZSwgTGVpY2h0LCBhbmQgTmV3bWFuIGlzIGNvbXBhdGlibGUgaXNuJ3Qgc3Ryb25nIGVub3VnaCB0byBjb25zaWRlciB0aGlzIHBhcnRpY3VsYXIgcmVsYXRpb25zaGlwIHRvIGJlIGNvbnNpZGVyZWQgaW50byB0aGUgc2FtZSBjb21tdW5pdHkuIEFuZCB3aHkgc2hvdWxkIHRoZXkgYmU/IEhvbG1lIGFuZCBMZWljaHQgYXJlIHBlcmZlY3RseSBmaW5lIGV4aXNpdGluZyBpbiB0aGVpciBvd24gY29tbXVuaXRpZXMgc3VjaCBhcyBDT01NXzMwMCB3aGljaCBtYWtlcyBtb3JlIHNlbnNlIHRoYW4gdHJ5aW5nIHRvIHNxdWVlemUgaW4gYSB3ZWFrIGxpbmsgaW50byBDT01NXzMwNS4gDQoNCkNvbnNpZGVyLCBOZXdtYW4gPC0+IFNuZXBwZW4gPC0+IFRydXNpbmEgPC0+IEhvbG1lIDwtPiBOZXdtYW4uIEluIHRoaXMgaW5zdGFuY2UgYXMgd2VsbCwgdGhlIGxpbmthZ2UgaXMgdG9vIGZhciBmb3IgaXQgdG8gYmUgY29uc2lkZXJlZCBhIGNvbW11bml0eSBiZWNhdXNlIFNuZXBwZW4gYW5kIEhvbG1lIGFyZW4ndCBkaXJlY3RseSBjb25uZWN0ZWQuIA0KDQoNCmBgYHtyfQ0KaW5jbHVkZV9ncmFwaGljcygiSW1hZ2VzL3EzX2I2LnBuZyIpICN3aG8ncyBjb25uZWN0ZWQgdG8gSG9sbWU/IGRlcHRoID0gMQ0KaW5jbHVkZV9ncmFwaGljcygiSW1hZ2VzL3EzX2I3LnBuZyIpICN3aG8ncyBjb25uZWN0ZWQgdG8gU25lcHBlbiBkZXB0aCA9IDEgDQpgYGANCg0KW0hvbG1lLCBQXSwgW1N0YXVmZmVyLCBEXSwgW1NvbGUsIFJdLCBbU25lcHBlbiwgS10NCg0KVHVybmluZyBub3cgdG8gd2hldGhlciB0aGUgbGlua3MgdG8gdGhlc2UgYXV0aG9ycyBhcmUgaW4gb3RoZXIgbGluayBjb21tdW5pdGllcywgd2UgY2FuIGNvbmZpcm0gdGhleSBhcmUgaW4gb3RoZXIgbGluayBjb21tdW5pdGllcyBieSBvYnNlcnZpbmcgdGhlIG5leHQgcGxvdC4gT2JzZXJ2ZSB0aGF0IEhvbG1lIGlzIGluIFtDT01NXzE3OCwgQ09NTV8zMDAsIENPTU1fMjEyXSwgU3RhdWZmZXIgaXMgaW4gW0NPTU1fMTk5LCBDT01NXzMxOCwgQ09NTV8yMTRdLCBTb2xlIGlzIGluIFtDT01NXzI4NiwgQ09NTV8zMTRdLCBhbmQgU25lcHBlbiBpcyBpbiBbQ09NTV8xOTcsIENPTU1fMjExXS4gVGhleSBhcmUgcGFydCBvZiB0aGVzZSBjb21tdW5pdGllcyBhcyB0aGV5IHByb2JhYmx5IGhhdmUgc3Ryb25nIGNvbW1vbiBuZWlnaGJvciB0aWVzIGFzc29jaWF0ZWQgdG8gdGhlc2UgbGluayBjb21tdW5pdGllcyByZXNwZWN0aXZlbHkgdGhhbiB0aGUgbWFpbiBjb21tdW5pdHkgQ09NTV8zMDUgdGhhdCBOZXdtYW4gaXMgYXNzb2NpYXRlZCB3aXRoLiANCg0KYGBge3J9DQppbmNsdWRlX2dyYXBoaWNzKCJJbWFnZXMvcTNfYjgucG5nIikgI3dobydzIGNvbm5lY3RlZCB0byBuZXdtYW4gZGVwdGggPSAyIA0KYGBgDQoNClRoZSB0aWVzIHRoYXQgTmV3bWFuIGhhcyB0byBhdXRob3JzIHdpdGggd2hvbSBoZSBoYXMgcHVibGlzaGVkIHdpdGggYnV0IGFyZSBub3QgaW4gaGlzIGxpbmsgY29tbXVuaXRpZXMgY2FuIGJlIGluZmVycmVkIHRvIGJlIHdlYWsgdGllcy4gVGhpcyBpcyBkdWUgdG8gdGhlIGZhY3QgdGhhdCBhbHRob3VnaCB0aGV5IGhhdmUgcHVibGlzaGVkIHdvcmsgdG9nZXRoZXIgKGkuZS4sIE5ld21hbiBhbmQgSG9sbWUpLCB0aGUgYW1vdW50IG9mIHdvcmsgdGhhdCB0aGV5IGhhdmUgcHVibGlzaGVkIHRvZ2V0aGVyIGlzIG5vdCBlbm91Z2ggdG8gY29uc2lkZXIgdGhlIGNvbm5lY3Rpb24gYSBzdHJvbmcgb25lLiBGb3IgaW5zdGFuY2UsIHRoZXkgY291bGQgaGF2ZSBwdWJsaXNoZWQgc29tZXRoaW5nIHRvZ2V0aGVyIG9ubHkgYSBmZXcgdGltZXMgKGkuZSwgNSB0aW1lcyksIHZlcnN1cyB0aGUgYXZlcmFnZSBhbW91bnQgb2YgcHVibGlzaGluZyBkb25lIGFjcm9zcyBldmVyeSBub2RlIGluIENPTU1fMzA1IChpLmUuLCA2IHRpbWVzKS4gVGhlc2UgbnVtYmVycyBhcmUgYXJiaXRyYXJ5IGJ1dCB0aGV5IHBvcnRyYXkgdGhlIGlkZWEgdGhhdCBtYXliZSB0byBiZSBpbmNsdWRlZCBpbiBDT01NXzMwNSB3aXRoIE5ld21hbiwgeW91IHdvdWxkIG5lZWQgYSBjZXJ0YWluIGFtb3VudCBvZiBwdWJsaXNoZWQgd29yay4gQmVjYXVzZSBIb2xtZSBoYXNuJ3QgcmVhY2hlZCB0aGUgdGhyZXNob2xkIHRvIGJlIGNvbnNpZGVyZWQgYSAic3Ryb25nIHRpZSIsIGhlIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBjb29sIGtpZHMgY2x1Yi4gDQoNClRoZXJlIGFyZSBvdGhlciBjb250cmlidXRpbmcgZmFjdG9ycyBhcyB3ZWxsLCBwZXJoYXBzIHdoYXQgdGhleSBwdWJsaXNoZWQgdG9nZXRoZXIgaXMgb3V0ZGF0ZWQuIFRoZXkgbWlnaHQgaGF2ZSB3b3JrZWQgdG9nZXRoZXIgYSBsb3Qgb2YgdGltZXMgaW4gdGhlIHBhc3QgYnV0IG1pZ2h0IGhhdmUgc3RvcHBlZCBjb2xsYWJvcmF0aW5nIGluIHByZXNlbnQgdGltZXMuIFNvIGJhc2VkIG9uIHRoZSBtb3N0IHJlY2VudCBkYXRhIHNldCwgeW91IGNvdWxkIGFyZ3VlIHRoYXQgdGhleSBhcmVuJ3QgaW4gdGhlIHNhbWUgbGluayBjb21tdW5pdHkgYnV0IHdlcmUgaW4gdGhlIHBhc3QuIE9uZSBtb3JlIHRoaW5nIEkgbWlnaHQgYWRkIGlzLCBwZXJoYXBzIE5ld21hbiBhbmQgSG9sbWUgbWF5IGhhdmUgYSBjb25uZWN0aW9uIGR1ZSB0byBwdWJsaXNoaW5nIHdvcmsgdG9nZXRoZXIsIGJ1dCBhcmVuJ3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBzYW1lIGNvbW11bml0eSBiZWNhdXNlIHRoZXkgc3BlY2lhbGl6ZSBpbiBkaWZmZXJlbnQgYXNwZWN0cyBvZiB0aGUgc3ViamVjdCBtYXR0ZXIuIFRoZXJlZm9yZSwgTmV3bWFuIHN1cnJvdW5kcyBoaW1zZWxmIHdpdGggb3RoZXIgcGVvcGxlIGluIHRoZSBzYW1lIGZpZWxkIGJ1dCB0b3BpYyBzcGVjaWZpYyBtYXR0ZXJzLCBhbmQgSG9sbWUgc3Vycm91bmRzIGhpbXNlbGYgYXMgd2VsbCB3aXRoIG90aGVyIHBlb3BsZSBpbiB0aGUgc2FtZSBmaWVsZCBidXQgdG9waWMgc3BlY2lmaWMgbWF0dGVyLiANCg0KVGhlIGNvbmNlcHQgb2Ygc3RydWN0dXJhbCBob2xlcyBhcHBsaWVzIGhlcmUgYmVjYXVzZSB0aGUgbG9jYXRpb24gb2YgTmV3bWFucyBub2RlIGFuZCBIb2xtZSdzIG5vZGUsIGZvciBpbnN0YW5jZSwgZGVwaWN0IHR3byB0eXBlcyBvZiBuZXR3b3JrcyB3aXRoIHJlZHVuZGFudCBhbmQgbm9uLXJlZHVuZGFudCBjb25uZWN0aW9ucy4gSG9sbWUncyBub2RlIGlzIG1vcmUgbGlrZWx5IHRvIGdldCBub3ZlbCBpbmZvcm1hdGlvbiB0aGFuIE5ld21hbi4gVGhpcyBpcyBiZWNhdXNlIG5vZGVzIGNvbm5lY3RlZCB0byBOZXdtYW4gYXJlIGFsc28gaGlnaGx5IGNvbm5lY3RlZCBiZXR3ZWVuIGVhY2ggb3RoZXIuIEFueSBpbmZvcm1hdGlvbiB0aGF0IG5vZGVzIGluIENPTU1fMzA1IGdldCBmcm9tIE5ld21hbiBjYW4gYWxzbyBiZSByZWNlaXZlZCBmcm9tIHN1cnJvdW5kIG5vZGVzIGFzIHdlbGwuIENvbXBhcmUgdGhpcyB3aXRoIEhvbG1lJ3Mgbm9kZSB3aGVyZSBpdCdzIHBvc2l0aW9uIG1ha2VzIGl0IHNlcnZlIGFzIGEgYnJpZGdlIG9yIGEgYnJva2VyIGJldHdlZW4gZGlmZmVyZW50IGNsdXN0ZXJzLiBIb2xtZSBpcyBtb3JlIGxpa2VseSB0byByZWNlaXZlIHNvbWUgbm9uLXJlZHVuZGFudCBpbmZvcm1hdGlvbi4gVGhlIHRlcm0gc3RydWN0dXJhbCBob2xlcyBpcyB1c2VkIGZvciB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIG5vbi1yZWR1bmRhbnQgY29udGFjdHMsIHRoZXJlZm9yZSwgYXMgdGhlcmUgaXMgYSBob2xlIGJldHdlZW4gdHdvIGNvbnRhY3RzLCB0aGV5IHByb3ZpZGUgbmV0d29yayBiZW5lZml0cyB0byBIb2xtZSwgdGhlIHRoaXJkIHBhcnR5IG5vZGUuIA0KDQpUaGUgZmFjdCB0aGF0IE5ld21hbiBoYXMgdGhlc2UgdGllcyBpbmRpY2F0ZXMgdGhhdCBoaXMgcm9sZSBpbiBOZXR3b3JrIFNjaWVuY2UgaW5jbHVkZXMgcGFzc2luZyByZWR1bmRhbnQgaW5mb3JtYXRpb24gbW9zdGx5IGJ1dCBnZW5lcmFsbHkgYmVpbmcgdGhlIG5vZGUgbW9zdCBwZW9wbGUgY29ubmVjdCB0byBpZiB0aGV5IHdhbnQgdG8gYmUgYXBhcnQgb2YgdGhlIENPTU1fMzA1IGNvbW11bml0eSBhbmQgdXNlIHRoZWlyIGluZm9ybWF0aW9uLiANCg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQojIyMjIDQuIEludGVycHJldGluZyBJbmR1Y2VkIE92ZXJsYXBwaW5nIE5vZGUgQ29tbXVuaXRpZXMgDQoNCkhhdmluZyBleHBsYWluZWQgaG93IGxpbmsgY29tbXVuaXRpZXMgYXJlIGNvbXB1dGVkLCBpbiB0aGlzIHNlY3Rpb24gd2UgZGVtb25zdHJhdGUgdGhlIHV0aWxpdHkgb2Ygb3ZlcmxhcHBpbmcgY29tbXVuaXR5IGRldGVjdGlvbiB3aXRoIGV4YW1wbGVzLg0KDQojIyMjIyAoYSkgQmFyYWJhc2kgYW5kIEFsYmVydCANCg0KRmlyc3Qgd2Ugc2hvdyBob3cgbWVtYmVyc2hpcCBpbiBsaW5rIGNvbW11bml0aWVzIG1hcHMgdG8gdGhlIGdyb3VuZC10cnV0aCBvZiBwYXBlciBwdWJsaWNhdGlvbnMgYnkgZmluZGluZyB0aGUgcGFwZXIgZm9yIGEgbGluayBjb21tdW5pdHkuICJCQVJBQkFTSSwgQSIgYW5kICJBTEJFUlQsIFIiIGFyZSBib3RoIGluIGxpbmsgY29tbXVuaXR5IENPTU1fMjI2LCBhbG9uZyB3aXRoIGNvLWF1dGhvcnMgSkVPTkcgSCwgT0xUVkFJIFosIFRPTUJPUiBCLCBCSUFOQ09OSSBHLCBhcyBzaG93biBiZWxvdzogDQoNCmBgYHtyICBlY2hvPUZBTFNFLCBmaWcuYWxpZ249ImNlbnRlciIsIGZpZy5jYXAgPSAiQmFyYWJhc2kgYW5kIEFsYmVydCdzIExpbmsgQ29tbXVuaXR5In0NCmluY2x1ZGVfZ3JhcGhpY3MoIkltYWdlcy9xNF9hLnBuZyIpDQpgYGANCg0KQWx0aG91Z2ggdGhpcyBsaW5rIGNvbW11bml0eSBpcyBiYXNlZCBvbiBtdWx0aXBsZSBwdWJsaWNhdGlvbnMsIG9uZSB3ZWxsIGtub3duIHBhcGVyIHRoYXQgaW5jbHVkZXMgbW9zdCBvZiB0aGUgbGluayBjb21tdW5pdHkgbWVtYmVycyBpczogDQoNCkplb25nIEgsIFRvbWJvciBCLCBBbGJlcnQgUiwgT2x0dmFpIFpOLCBCYXJhYsOhc2kgQUwuIFRoZSBsYXJnZS1zY2FsZSBvcmdhbml6YXRpb24gb2YgbWV0YWJvbGljIG5ldHdvcmtzLiBOYXR1cmUuIDIwMDAgT2N0IDU7NDA3KDY4MDQpOjY1MS00LiBkb2k6IDEwLjEwMzgvMzUwMzY2MjcuIFBNSUQ6IDExMDM0MjE3Lg0KDQojIyMjIyAoYikgUGFzdG9yLVNhdG9ycmFzDQoNCkFuIGFkdmFudGFnZSBvZiBsaW5rIGNvbW11bml0aWVzIG92ZXIgcGFydGl0aW9uaW5nIG1ldGhvZHMgaXMgdGhhdCBhIG5vZGUgbWF5IGJlbG9uZyB0byBtb3JlIHRoYW4gb25lIGNvbW11bml0eS4gQXMgc2hvd24gYmVsb3csICJQQVNUT1JTQVRPUlJBUywgUiIgKFBhc3Rvci1TYXRvcnJhcyksIGlzIGludm9sdmVkIGluIHNldmVyYWwgbGluayBjb21tdW5pdGllcy4gV2UgaWRlbnRpZnkgdGhyZWUgb2YgdGhlbSBiZWxvdywgY29ycmVzcG9uZGluZyB0byBtYWpvciBhcHBsaWNhdGlvbnMgb2YgbmV0d29yayBzY2llbmNlIGluIHdoaWNoIFBhc3Rvci1TYXRvcnJhcyBoYXMgcHVibGlzaGVkLiANCg0KKipFcGlkZW1pYyBTcHJlYWRpbmcgaW4gTmV0d29ya3M6KiogUGFzdG9yLVNhdG9ycmFzIGlzIGluIGxpbmsgY29tbXVuaXR5OiBDT01NXzI3OSwgQ09NTV8yNjMsIGFsb25nIHdpdGggY28tYXV0aG9ycyBWZXNwaWduYW5pIEEsIE1vcmVubyBZLCBhbmQgQmFydGhlbGVteSBNLiAoVGhlcmUgYXJlIG1vcmUgYnV0IGZvciB0aGUgc2FrZSBvZiBzaW1wbGljaXR5IEkgY2hvc2UgdGhlc2UgMyBjb21tdW5pdGllcyBhbmQgMyBhdXRob3JzLikgIGFzIHNob3duIGJlbG93OiANCg0KYGBge3IgIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0iY2VudGVyIiwgZmlnLmNhcCA9ICJQYXN0b3ItU2F0b3JyYXMnIEVwaWRlbWlvbG9neSBMaW5rIENvbW11bml0eSJ9DQogaW5jbHVkZV9ncmFwaGljcygiSW1hZ2VzL3E0X2IucG5nIikNCmBgYA0KDQpQYXBlcnMgaW4gdGhpcyBsaW5rIGNvbW11bml0eSBpbmNsdWRlIHdvcmsgb24gZXBpZGVtaWMgc3ByZWFkaW5nIGluIG5ldHdvcmtzLCBhcyBldmlkZW5jZWQgYnkgdGhpcyBwdWJsaWNhdGlvbiBpbnZvbHZpbmcgbW9zdCBvciBhbGwgb2YgdGhlc2UgYXV0aG9yczogDQoNClBhc3Rvci1TYXRvcnJhcyBSLCBWZXNwaWduYW5pIEEuIEVwaWRlbWljIHNwcmVhZGluZyBpbiBzY2FsZS1mcmVlIG5ldHdvcmtzLiBQaHlzIFJldiBMZXR0LiAyMDAxIEFwciAyOzg2KDE0KTozMjAwLTMuIGRvaTogMTAuMTEwMy9QaHlzUmV2TGV0dC44Ni4zMjAwLiBQTUlEOiAxMTI5MDE0Mi4NCg0KTW9yZW5vLCBZLiwgUGFzdG9yLVNhdG9ycmFzLCBSLiAmIFZlc3BpZ25hbmksIEEuIEVwaWRlbWljIG91dGJyZWFrcyBpbiBjb21wbGV4IGhldGVyb2dlbmVvdXMgbmV0d29ya3MuIEV1ci4gUGh5cy4gSi4gQiAyNiwgNTIx4oCTNTI5ICgyMDAyKS4gaHR0cHM6Ly9kb2kub3JnLzEwLjExNDAvZXBqYi9lMjAwMjAxMjINCg0KQmFydGjDqWxlbXkgTSwgQmFycmF0IEEsIFBhc3Rvci1TYXRvcnJhcyBSLCBWZXNwaWduYW5pIEEuIER5bmFtaWNhbCBwYXR0ZXJucyBvZiBlcGlkZW1pYyBvdXRicmVha3MgaW4gY29tcGxleCBoZXRlcm9nZW5lb3VzIG5ldHdvcmtzLiBKIFRoZW9yIEJpb2wuIDIwMDUgSnVsIDIxOzIzNSgyKToyNzUtODguIGRvaTogMTAuMTAxNi9qLmp0YmkuMjAwNS4wMS4wMTEuIFBNSUQ6IDE1ODYyNTk1Lg0KDQoNCioqUHJvdGVpbiBJbnRlcmFjdGlvbiBOZXR3b3JrczoqKiBQYXN0b3ItU2F0b3JyYXMgaXMgaW4gbGluayBjb21tdW5pdHkgQ09NTV8yODYsIGFsb25nIHdpdGggY28tYXV0aG9ycyBTbWl0aCBFIGFuZCBTb2xlIFIgYXMgc2hvd24gYmVsb3c6IA0KDQpgYGB7ciAgZWNobz1GQUxTRSwgZmlnLmFsaWduPSJjZW50ZXIiLCBmaWcuY2FwID0gIlBhc3Rvci1TYXRvcnJhcycgUHJvdGVpbiBJbnRlcmFjdGlvbiBMaW5rIENvbW11bml0eSJ9DQppbmNsdWRlX2dyYXBoaWNzKCJJbWFnZXMvcTRfYjIucG5nIikNCmBgYA0KDQpQYXBlcnMgaW4gdGhpcyBsaW5rIGNvbW11bml0eSBpbmNsdWRlIHdvcmsgb24gcHJvdGVpbiBpbnRlcmFjdGlvbiBuZXR3b3JrcywgYXMgZXZpZGVuY2VkIGJ5IHRoaXMgcHVibGljYXRpb24gaW52b2x2aW5nIG1vc3Qgb3IgYWxsIG9mIHRoZXNlIGF1dGhvcnM6IA0KDQpQYXN0b3ItU2F0b3JyYXMgUiwgU21pdGggRSwgU29sw6kgUlYuIEV2b2x2aW5nIHByb3RlaW4gaW50ZXJhY3Rpb24gbmV0d29ya3MgdGhyb3VnaCBnZW5lIGR1cGxpY2F0aW9uLiBKIFRoZW9yIEJpb2wuIDIwMDMgTWF5IDIxOzIyMigyKToxOTktMjEwLiBkb2k6IDEwLjEwMTYvczAwMjItNTE5MygwMykwMDAyOC02LiBQTUlEOiAxMjcyNzQ1NS4NCg0KKipTb2NpYWwgRGlzdGFuY2UgQXR0YWNobWVudDoqKiANCg0KUGFzdG9yLVNhdG9ycmFzIGlzIGluIGxpbmsgY29tbXVuaXR5IENPTU1fMjAzLCBhbG9uZyB3aXRoIGNvLWF1dGhvcnMgQk9HVU5BIE0sIERJQVpHVUlMRVJBIEEsIEFSRU5BUyBBIGFzIHNob3duIGJlbG93OiANCg0KYGBge3IgIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0iY2VudGVyIiwgZmlnLmNhcCA9ICJQYXN0b3ItU2F0b3JyYXMnIFNvY2lhbCBEaXN0YW5jZSBMaW5rIENvbW11bml0eSJ9DQppbmNsdWRlX2dyYXBoaWNzKCJJbWFnZXMvcTRfYjMucG5nIikNCmBgYA0KDQpQYXBlcnMgaW4gdGhpcyBsaW5rIGNvbW11bml0eSBpbmNsdWRlIHdvcmsgb24gc29jaWFsIGRpc3RhbmNlIGF0dGFjaG1lbnQsIGFzIGV2aWRlbmNlZCBieSB0aGlzIHB1YmxpY2F0aW9uIGludm9sdmluZyBtb3N0IG9yIGFsbCBvZiB0aGVzZSBhdXRob3JzOiANCg0KQm9ndcOxw6EsIE1hcmnDoW4sIFJvbXVhbGRvIFBhc3Rvci1TYXRvcnJhcywgQWxiZXJ0IETDrWF6LUd1aWxlcmEgYW5kIEFsZXggQXJlbmFzLiDigJxNb2RlbHMgb2Ygc29jaWFsIG5ldHdvcmtzIGJhc2VkIG9uIHNvY2lhbCBkaXN0YW5jZSBhdHRhY2htZW50LuKAnSBQaHlzaWNhbCByZXZpZXcuIEUsIFN0YXRpc3RpY2FsLCBub25saW5lYXIsIGFuZCBzb2Z0IG1hdHRlciBwaHlzaWNzIDcwIDUgUHQgMiAoMjAwNCk6IDA1NjEyMiAuDQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KIyMjIyA1LiBDb21wYXJpbmcgdG8gUGFydGl0aW9uIE1ldGhvZHMgDQoNCkluIGEgcHJldmlvdXMgYW5hbHlzaXMgd2UgY29tcGFyZWQgTG91dmFpbiBhbmQgSW5mb01hcCB0byBlYWNoIG90aGVyLiBCZWxvdyB3ZSBjb21wYXJlIExvdmFpbiBhbmQgSW5mb01hcCBwYXJ0aXRpb25zIHRvIGxpbmsgY29tbXVuaXRpZXMsIHRvIHNlZSB0aGVpciBzaW1pbGFyaXRpZXMgYW5kIGRpZmZlcmVuY2VzLiBUbyBmYWNpbGl0YXRlIHRoZSBjb21wYXJpc29uLCB3ZSBoYXZlIHNlbGVjdGVkIGEgcG9ydGlvbiBvZiB0aGUgZnVsbCB2aXN1YWxpemF0aW9uIGFuZCBjb2xvcmVkIG5vZGVzIGJ5IGJvdGggTG91dmFpbiBhbmQgSW5mb01hcCBwYXJ0aXRpb25pbmcsIHNob3duIGJlbG93OiANCg0KKipMb3V2YWluIGFuZCBMaW5rIENvbW11bml0aWVzKioNCmBgYHtyICBlY2hvPUZBTFNFLCBmaWcuYWxpZ249ImNlbnRlciIsIGZpZy5jYXAgPSAiTG91dmFpbiBhbmQgTGluayBDb21tdW5pdGllcyJ9DQppbmNsdWRlX2dyYXBoaWNzKCJJbWFnZXMvcTVfYS5wbmciKSAjIGZvciBMb3V2YWluIA0KaW5jbHVkZV9ncmFwaGljcygiSW1hZ2VzL3E1X2EyLnBuZyIpICMgZm9yIGNvbG9yIGNvZGUgDQpgYGANCg0KKipJbmZvTWFwIGFuZCBMaW5rIENvbW11bml0aWVzKioNCmBgYHtyICBlY2hvPUZBTFNFLCBmaWcuYWxpZ249ImNlbnRlciIsIGZpZy5jYXAgPSAiSW5mb01hcCBhbmQgTGluayBDb21tdW5pdGllcyJ9DQppbmNsdWRlX2dyYXBoaWNzKCJJbWFnZXMvcTVfYi5wbmciKSAjIGZvciBJbmZvTWFwIA0KaW5jbHVkZV9ncmFwaGljcygiSW1hZ2VzL3E1X2IyLnBuZyIpICMgZm9yIGNvbG9yIGNvZGUNCmBgYA0KDQpXZSBub3RpY2UgdGhlIGZvbGxvd2luZyBzaW1pbGFyaXRpZXMgYW5kIGRpZmZlcmVuY2VzIGJldHdlZW4gbGluayBjb21tdW5pdGllcyBhbmQgdGhlIG90aGVyIHR3bzogDQoNCkZvciBzaW1pbGFyaXRpZXM6IFRoZSB2aXN1YWwgaW1wYWN0IHNob3dzIHRoYXQgbG91dmFpbiBhbmQgaW5mb21hcCB1bmRlcnN0b29kIHRoZSBnZW5lcmFsIGlkZWEgb2YgdGhlIGFtb3VudCBvZiBjb21tdW5pdGllcyB0aGVyZSBhcmUuIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhlIGFtb3VudCBvZiBwZW9wbGUgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGNvbW11bml0eS4gSWYgeW91IHRha2UgYSBsb29rIGF0IHRoZSBjb2xvciBjaGFydCBhc3NvY2lhdGVkIHdpdGggaW5mb21hcCBvciBsb3V2YWluIHJlc3BlY3RpdmVseSwgeW91IGNhbiBzZWUgbG91dmFpbiBpcyB0eXBpY2FsbHkgb3ZlcmVzdGltYXRpbmcgdGhlIGFtb3VudCBvZiBub2RlcyB0aGF0IGJlbG9uZyBpbiBhIGNvbW11bml0eSB3aGVyZWFzIGluZm9tYXAgcHJvdmlkZXMgZmluZXIgZ3JhbnVsYXJpdHkgcGFydGl0aW9ucy4gTG91dmFpbiBzZWVtcyB0byBjb25zaWRlciB0aGF0IG1vcmUgbm9kZXMgYmVsb25nIHRvIHBhcnRpY3VsYXIgY29tbXVuaXRpZXMgYmVjYXVzZSBvZiB0aGUgZ3JhbnVsYXJpdHkgb2Ygb3ZlcmxhcHBpbmcgbm9kZSBjb21tdW5pdGllcy4gV2hlbiBzZXZlcmFsIG5vZGVzIG92ZXJsYXAsIGxvdXZhaW4ncyB3ZWlnaHQgdGhyZXNob2xkIGlzIHByb2JhYmx5IGRldGVybWluaW5nIHRoYXQgdGhleSBiZWxvbmcgaW4gdGhlIGNvbW11bml0eS4gVGhpcyBtZWFucyBvdXIgc2NlbmFyaW8gcHJldmlvdXNseSBvZiBhbiBhdXRob3IgcHVibGlzaGluZyB3aXRoIGFub3RoZXIgYXV0aG9yIGJ1dCB0aGV5IGRvbid0IHNoYXJlIGEgY29tbXVuaXR5IHdvdWxkIG5vdCBhcHBlYXIgZnJvbSBMb3V2YWluIGFzIGl0IHdvdWxkIGFzc3VtZSB0aGV5IGFyZSBpbiB0aGUgc2FtZSBjb21tdW5pdHkuIA0KDQpCZWNhdXNlIG9mIHRoaXMsIGxvdXZhaW4gYW5kIGluZm9tYXAgZG8gbm90IGFncmVlIG9uIHRoZSB0cnVlIHNpemVzIG9mIHRoZSBjb21tdW5pdGllcy4gVGhlIGNvbG9ycyBhcmUgYXNzb2NpYXRlZCBpbiBvcmRlci4gTG91dmFpbiBzYXlzOiBCYXJhYmFzaSAob3JhbmdlKSBpcyB0aGUgNHRoIGxhcmdlc3QgY29tbXVuaXR5IHdoaWxzdCBJbmZvbWFwIHNheXM6IEJhcmFiYXNpIChibHVlKSBpcyB0aGUgMm5kIGxhcmdlc3QgY29tbXVuaXR5LiANCg0KQ29uc2lkZXJpbmcgcXVlc3Rpb24gMywgSSB3b3VsZCBzdWdnZXN0IHRoYXQgTGluayBDb21tdW5pdGllcyBhbHNvIGZpbmRzIHRoZXNlIHNwZWNpZmljIGJlaGF2aW9ycy4gRm9yIGV4YW1wbGUsIGluIHF1ZXN0aW9uIDMsIHdlIGNvbmNsdWRlZCB0aGF0LCAiVGhlIGZpcnN0IHBhaXIgYXJlIG5vdCBpbiBOZXdtYW4ncyBsaW5rIGNvbW11bml0eSBiZWNhdXNlIG9uY2UgTmV3bWFuIGNvbm5lY3RzIHRvIGVpdGhlciBTb2xlIG9yIFN0YXVmZmVyLCBldmVyeSBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGVtIG5ldmVyIGxlYXZlcyB0aGVpciBjb21tdW5pdHkuIiBUaGlzIHdvdWxkIGJlIGRpZmZpY3VsdCB0byBmaW5kIGZvciBMb3V2YWluIGFzIExvdXZhaW4gd291bGQgb3ZlcmZpdCB0aGUgYW1vdW50IG9mIG5vZGVzIHRoYXQgYmVsb25nIGluIGEgY29tbXVuaXR5IGFuZCB0aGlzIGJlaGF2aW9yIG9mIGEgbm9kZSBuZXZlciBsZWF2aW5nIGl0J3MgY29tbXVuaXR5IHdvdWxkIGRpc2FwcGVhci4gDQoNCkluIGFkZGl0aW9uLCBjb25zaWRlcmluZyBxdWVzdGlvbiAzIGFnYWluLCBMaW5rIENvbW11bml0aWVzIHdvdWxkIGFsc28gaGVscCBmaW5kIG5vZGVzIHRoYXQgYWN0IGFzIGJyaWRnZXMgbW9yZSBhY2N1cmF0ZWx5LiBJZiBhIG5vZGUgaXMgb3ZlcmZpdCBpbnRvIGEgY29tbXVuaXR5IGl0IGRvZXNuJ3QgYmVsb25nIGluLCB0aGVuIHlvdSBjYW4ndCBjb25zaWRlciB0aGVtIGFzIGJyaWRnZSBub2RlcyBhbmQgdGhlaXIgcHVycG9zZSB3aWxsIGRpc2FwcGVhci4gDQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KIyMjIFBhdSANCg==